package jsave.journalisation;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.List;

import jsave.action.Action;
import jsave.conf.Configuration;
import jsave.util.Utilitaire;

import org.apache.log4j.Logger;

public class JournalisationHTML {

	private static final Logger log = Logger
			.getLogger(JournalisationHTML.class);

	private static Configuration conf = null;

	public JournalisationHTML() {
	}

	public static void genererLogHTML(Configuration c) {

		conf = c;

		BufferedReader input = null;
		PrintWriter output = null;
		String ligne = null;

		try {
			// Lecture dans un fichier
			// FileReader in = new FileReader("/resources/modele_log.html");
			// Lecture dans un fichier du jar
			InputStreamReader in = new InputStreamReader(ClassLoader
					.getSystemResourceAsStream("resources/modele_log.html"));

			output = new PrintWriter(new BufferedWriter(new FileWriter(conf
					.getFichierJournalisation().getPath())));
			input = new BufferedReader(in);

			do {
				ligne = remplacerTag(input.readLine());
				if (ligne != null) {
					output.println(ligne);
				}
			} while (ligne != null);
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		} finally {
			// fermeture des fichiers
			if (input != null) {
				try {
					input.close();
				} catch (Exception e) {
					log.error(e.getMessage(), e);
				}
			}
			if (output != null) {
				try {
					output.close();
				} catch (Exception e) {
					log.error(e.getMessage(), e);
				}
			}
		}
	}

	private static String remplacerTag(String input) {

		if (input == null)
			return null;

		if (input.indexOf("@JSAVETAG_PROFIL") != -1) {
			input = input.replaceAll("@JSAVETAG_PROFIL", conf.getNom());
		} else if (input.indexOf("@JSAVETAG_MESSAGE") != -1) {
			input = "";
		} else if (input.indexOf("@JSAVE_SOURCE") != -1) {
			input = input.replaceAll("@JSAVE_SOURCE", conf.getSource()
					.getPath().replaceAll("\\\\", "/"));
		} else if (input.indexOf("@JSAVE_DESTINATION") != -1) {
			input = input.replaceAll("@JSAVE_DESTINATION", conf
					.getDestination().getPath().replaceAll("\\\\", "/"));
		} else if (input.indexOf("@JSAVE_DEMARRAGE") != -1) {
			input = input.replaceAll("@JSAVE_DEMARRAGE", Utilitaire
					.getDateTemps(conf.getChrono().getDateDepart().getTime()));
		} else if (input.indexOf("@JSAVE_DUREE") != -1) {
			input = input.replaceAll("@JSAVE_DUREE", conf.getChrono()
					.getDuree());
		} else if (input.indexOf("@JSAVE_RECURSIF") != -1) {
			input = input.replaceAll("@JSAVE_RECURSIF", conf.isRecursif() + "");
		} else if (input.indexOf("@JSAVE_ACTIONA") != -1) {
			input = input.replaceAll("@JSAVE_ACTIONA", conf.getActionA()
					.getNom());
		} else if (input.indexOf("@JSAVE_ACTIONB") != -1) {
			input = input.replaceAll("@JSAVE_ACTIONB", conf.getActionB()
					.getNom());
		} else if (input.indexOf("@JSAVE_ACTIONC") != -1) {
			input = input.replaceAll("@JSAVE_ACTIONC", conf.getActionC()
					.getNom());
		} else if (input.indexOf("@JSAVE_ACTIOND") != -1) {
			input = input.replaceAll("@JSAVE_ACTIOND", conf.getActionD()
					.getNom());
		} else if (input.indexOf("@JSAVETAG_NB_EXCLUSIONS") != -1) {
			input = input.replaceAll("@JSAVETAG_NB_EXCLUSIONS", "1");
		} else if (input.indexOf("@JSAVETAG_EXCLUSIONS") != -1) {
			StringBuffer exclusionsSB = new StringBuffer("");
			List<String> exclusions = conf.getFileFilterSource()
					.getListExclusions();
			if (exclusions == null
					|| (exclusions != null && exclusions.size() == 0)) {
				exclusionsSB.append("<td>&nbsp;</td>");
			}
			for (int i = exclusions.size() - 1; i > 0; i--) {
				exclusionsSB.append("<td>").append(
						((String) exclusions.get(i)).replaceAll("\\\\", "/"))
						.append("</td>\n");
			}
			input = input.replaceAll("@JSAVETAG_EXCLUSIONS", exclusionsSB
					.toString());
		} else if (input.indexOf("@JSAVETAG_NB_FICH_PARCOURUS") != -1) {
			input = input.replaceAll("@JSAVETAG_NB_FICH_PARCOURUS", (conf
					.getNbFichiersParcourus() + conf.getNbDossiersParcourus())
					+ "");
		} else if (input.indexOf("@JSAVETAG_NB_FICH_AJOUTES") != -1) {
			input = input.replaceAll("@JSAVETAG_NB_FICH_AJOUTES", (conf
					.getNbFichiersAjoutes() + conf.getNbDossiersAjoutes())
					+ "");
		} else if (input.indexOf("@JSAVETAG_NB_FICH_MAJ") != -1) {
			input = input.replaceAll("@JSAVETAG_NB_FICH_MAJ", conf
					.getNbFichiersMAJ()
					+ "");
		} else if (input.indexOf("@JSAVETAG_NB_FICH_SUPPRIMES") != -1) {
			input = input.replaceAll("@JSAVETAG_NB_FICH_SUPPRIMES", (conf
					.getNbFichiersSupprimes() + conf.getNbDossiersSupprimes())
					+ "");
		} else if (input.indexOf("@JSAVETAG_NB_FICH_IGNORES") != -1) {
			input = input.replaceAll("@JSAVETAG_NB_FICH_IGNORES", (conf
					.getNbFichiersIgnores() + conf.getNbDossiersIgnores())
					+ "");
		} else if (input.indexOf("@JSAVETAG_ACTIONS_FICHIERS") != -1) {
			List<JSaveFile> actionsFile = Action.getActionsFile();
			StringBuffer sb = new StringBuffer("");
			log.debug("Nb actions = " + actionsFile.size());
			for (int i = 0; i < actionsFile.size(); i++) {
				sb.append(((JSaveFile) actionsFile.get(i)).getActionLogHTML());
			}
			return sb.toString();
		}

		return input;
	}
}
